package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.dao.CalleDAO;
import mx.ipn.to.CalleTO;

public class CalleDAOMySQL implements CalleDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(CalleDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO calle (nombre) VALUES(?)";
	private static final String DELETE = "DELETE FROM calle WHERE id_calle=?";
	private static final String UPDATE = "UPDATE calle SET nombre=? WHERE id_calle=?";

	private static final String FINDBYID = "SELECT * FROM calle WHERE id_calle=?";
	private static final String FINDBYNOMBRE = "SELECT * FROM calle WHERE nombre=?";
	private static final String SELECT = "SELECT * FROM calle";

	@Override
	public short deleteCalle(int idCalle) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idCalle);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public CalleTO findCalleById(int idCalle) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idCalle);

			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				idCalle = rs.getInt("id_calle");
				String nombre = rs.getString("nombre");
				CalleTO calleTO = new CalleTO(idCalle, nombre);

				ps.close();
				conexion.close();
				return calleTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public CalleTO findCalleByNombre(String nombre) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYNOMBRE);

			ps.setString(1, nombre);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				int idCalle = rs.getInt("id_calle");

				CalleTO calleTO = new CalleTO(idCalle, nombre);

				ps.close();
				conexion.close();
				return calleTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public int insertCalle(CalleTO calleTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, calleTO.getNombre());

			ps.executeUpdate();

			// atrapa el indice del campo agregado
		    int autoIncIndice = -1;
		    ResultSet rs = ps.getGeneratedKeys();

		    if (rs.next()) {
		        autoIncIndice = rs.getInt(1);
		    } else {
		    	System.err.print("No se pudo agregar campo");
		    	return 0;
		    }
			
			ps.close();
			conexion.close();

			return autoIncIndice;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

	@Override
	public ArrayList<CalleTO> selectCalle() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			ArrayList<CalleTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<CalleTO>();
				int idCalle = rs.getInt("id_calle");
				String nombre = rs.getString("nombre");

				CalleTO calleTO = new CalleTO(idCalle, nombre);
				coleccion.add(calleTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateCalle(CalleTO calleTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setString(1, calleTO.getNombre());
			ps.setInt(2, calleTO.getIdCalle());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}

	}

}
